package com.ysz.server.conn;

import com.ysz.common.struct.ClientStruct;
import com.ysz.server.DynamicGrouping;
import com.ysz.common.util.TimeUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ClassName ServerConn
 * @Description TODO
 * @Data 15:53
 * @Version 1.0
 * @Author ysz
 */
public class ServerConn {


    /**
     * 接收客户端的心跳请求
     * 1.根据请求中的上一次心跳时间去动态分组中删除节点（客户端心跳不超时的情况下是可以正常删除的）
     * 2.计算出下一次的心跳发送时间
     * 3.将请求数据插入动态分组中去
     *
     * @date 2022/3/3 17:23
     */
    public void accept(ClientStruct clientStruct) {
        //1.
        ConcurrentHashMap<Integer, List<ClientStruct>> map = DynamicGrouping.getMAP();
        if (Objects.nonNull(clientStruct.getBeforeSendTime())) {
            map.get(TimeUtil.parseLocalDateTime(clientStruct.getBeforeSendTime()))
                    .removeIf(cli -> {
                        if (Objects.equals(cli.getIp(), clientStruct.getIp())) {
                            System.out.println("准备移除动态分组上的旧节点： " + cli.getIp());
                            return true;
                        }
                        return false;
                    });
        }
        //2.
        //在发送时间的基础上增加秒数得到的结果就是下一次要发送的时间
        clientStruct.setNextSendTime(TimeUtil.getNewNextSendTime(clientStruct));
        //3.
        List<ClientStruct> clientStructs = map.get(TimeUtil.parseLocalDateTime(clientStruct.getSendTime()));
        if (Objects.isNull(clientStructs)) {
            clientStructs = new ArrayList<>();
            map.put(TimeUtil.parseLocalDateTime(clientStruct.getSendTime()), clientStructs);
        }
        clientStructs.add(clientStruct);
        System.out.println("客户端： " + clientStruct.getIp() + "添加后====》当前的动态分组数据为：===》" + map);
    }
}
